# 第二个解法，参考我看到b站视频
#哈希表+单指针解法


class Solution:
    def lengthOfLongestSubstring(self,s:str):
        start=-1
        max=0
        d={}
        for i in range(len(s)):
            if s[i] in d and d[s[i]]>start:
                start=d[s[i]]
                d[s[i]]=i
            else:
                d[s[i]]=i
                if i-start>max:
                    max=i-start

        return max

## 示例 1:
# 输入: s = "abcabcbb"
# 输出: 3
# 解释: 因为无重复字符的最长子串是 "abc"，所以其长度为 3。

# # 示例 2:
# 输入: s = "bbbbb"
# 输出: 1
# 解释: 因为无重复字符的最长子串是 "b"，所以其长度为 1。

# #示例 3:
# 输入: s = "pwwkew"
# 输出: 3
# 解释: 因为无重复字符的最长子串是 "wke"，所以其长度为 3。
#      请注意，你的答案必须是 子串 的长度，"pwke" 是一个子序列，不是子串。
#print(s)

#测试数据
s = "abcabcbb"

solution = Solution()
print(solution.lengthOfLongestSubstring(s))

s = "bbbbb"
solution = Solution()
print(solution.lengthOfLongestSubstring(s))

s = "pwwkew"
solution = Solution()
print(solution.lengthOfLongestSubstring(s))
